#pragma once

#include <iostream>
#include<unistd.h>
#include <pthread.h>

namespace mutexModule
{
    class Mutex
    {
    private:
        pthread_mutex_t _lock;

    public:
    // zdl:: 这里还有一个非常重要的我i点就是再实践中我们希望只是用一把锁
    // zdl:: 所以我们就要做一些手脚
    // zdl:但是我们也不会使用这样做法
        // Mutex(const Mutex& ) = delete;
        // const Mutex& operator = (const Mutex&) = delete;
        // 删除不要的拷⻉和赋值 
        Mutex(const Mutex &) = delete;
        const Mutex &operator =(const Mutex &) = delete;
        // zdl:: 通过上面的操作就直接将拷贝构造和赋值引用给禁掉
        Mutex(/* args */)
        {
            int n = pthread_mutex_init(&_lock, nullptr);
            (void)n;
        }
        ~Mutex()
        {
            int n = pthread_mutex_unlock(&_lock);
            (void)n;
        }
        pthread_mutex_t *lockPtr(void)
        {
            return &_lock;
        }
        void lock()
        {
            int n = pthread_mutex_lock(&_lock);
            static_cast<void>(n);
        }
        void unlock()
        {
            int n = pthread_mutex_unlock(&_lock);
            (void)n;
        };
    };
    class LockGuard
    {
        private:
        Mutex &_mtx;
        public:
        LockGuard(Mutex &mtx):_mtx(mtx)
        {
            _mtx.lock();
        }
        ~LockGuard()
        {
            _mtx.unlock();
        }
    };

};

// zdl:: 现在我还要继续练习打字的技巧
// zdl:: 还有很多值得练习